#include"TableSymboleManager.hpp"

TableSymboleManager::TableSymboleManager(){
  this->beginState=true;
  this->numNiveau=0;
}


TableSymb* TableSymboleManager::getCurrentTableSymb(){
  Niveau n = this->niveaux[this->numNiveau-1];
  return n.current();  
}


void TableSymboleManager::beginProgram(TableSymb* t){
  Niveau n(t);
  this->niveaux.push_back(n);
  this->numNiveau++;
  this->beginState=true;
}

void TableSymboleManager::begin(string name){
  TableSymb* tCurrent = this->getCurrentTableSymb();
  if(this->beginState==true){
    this->numNiveau++; 
    if(this->numNiveau-1 == this->niveaux.size()){
      Niveau n;
      this->niveaux.push_back(n);
    }
  }
  this->niveaux[this->numNiveau-1].newTable( name, tCurrent);  
  this->beginState=true;
}

void TableSymboleManager::end(){
      this->numNiveau--;
}


Symbole* TableSymboleManager::find(unsigned int id){
  //rechercher dans tous les parents du getCurrentTableSymb
  Symbole* result=NULL;
  TableSymb* ts = this->getCurrentTableSymb();
  do{
    result=ts->getSymbole(id);
    if(result!=NULL) break;
    ts=ts->getParent();
  }while(ts!=NULL);  
  return result;
}

void TableSymboleManager::print() {
  //Afficher les Tables de symbole de tous les niveaux
  unsigned int i;
  for(i=0;i<this->niveaux.size();i++){
    this->niveaux[i].print();
  }
}

TableSymboleManager::~TableSymboleManager(){
  while(!this->niveaux.empty()) {
    this->niveaux.pop_back();
  }
}


